package br.unicamp.ic.mc906.TextProcessing;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import br.unicamp.ic.mc906.kmeans.KmeansInterface;


/**
 * Classe responsavel por caraterizar um texto em forma de um objeto
 * @author guilherme
 * @since 0.1
 */
public class Text implements KmeansInterface<Text> {
	
	// Variavel referente ao nome do arquivo de texto
	private String name;
	
	// Variavel referente ao nome do grupo que o texto pertence
	private String group;
	
	// Variavel referente a todo texto do arquivo
	private String text;

	// Variavel referente a frequencia de cada palavra no texto
	private Map<String, Integer> frequencia; 
	
	// Variavel referente a maior frequencia das palavras do texto.
	private Map<String, Integer> maisFrequentes;
	
	
	
	public Text(){
		this.frequencia = new TreeMap<String,Integer>();
	};
	
	public Text(String name) {
		this.frequencia = new TreeMap<String, Integer>();
		this.name = name;
	}
	
	public Text(String fileName, String text) {
		this.name = fileName;
		this.text = text;
		this.frequencia = new TreeMap<String,Integer>();
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getText() {
		return text;
	}
	
	public void setText(String text) {
		this.text = text;
	}

	public Map<String, Integer> getFrequencia() {
		return frequencia;
	}

	public void setFrequencia(Map<String, Integer> frequencia) {
		this.frequencia = frequencia;
	}

	public Map<String, Integer> getMaisFrequentes() {
		return maisFrequentes;
	}

	public void setMaisFrequentes(Map<String, Integer> maisFrequentes) {
		this.maisFrequentes = maisFrequentes;
	}

	@Override
	public Text centroidOfCluster(List<Text> elements) {
		// Forma um Text com as palavras mais frequentes de todos
		Map<String, Integer> maisFrequentesDoCluster = new TreeMap<String, Integer>();
		for (Text t : elements) {
			for (String s : t.getMaisFrequentes().keySet()) {
				if (maisFrequentesDoCluster.containsKey(s)) {
					maisFrequentesDoCluster.put(s, maisFrequentesDoCluster.get(s)+1);
				} else {
					maisFrequentesDoCluster.put(s, 1);
				}
				
			}
		}
		List<Integer> maiorFrequencia = new LinkedList<Integer>();
		maiorFrequencia.addAll(maisFrequentesDoCluster.values());
		Collections.sort(maiorFrequencia, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1.compareTo(o2)*(-1);
			}
		});
		
		Map<String, Integer> clusterMaisFrequentes = new TreeMap<String,Integer>();
		for (int i = 0; i < 20 && i<maiorFrequencia.size();i++) {
			for (String s: maisFrequentesDoCluster.keySet()) {
				if (maisFrequentesDoCluster.get(s).equals(maiorFrequencia.get(i))) {
					clusterMaisFrequentes.put(s, maiorFrequencia.get(i));
				}
			}
		}
		Text novo = new Text();
		novo.setFrequencia(clusterMaisFrequentes);
		novo.setMaisFrequentes(clusterMaisFrequentes);
		
		return novo;
	}

	@Override
	public double getDistance(Text element) {
		int numeroPalavrasIguais = 0;
		for (String s : element.getMaisFrequentes().keySet()) {
			if (this.getMaisFrequentes().containsKey(s)) {
				numeroPalavrasIguais++;
			}
		}
		return 100-(10*numeroPalavrasIguais);
	}

	public String getGroup() {
		return group;
	}

	public void setGroup(String group) {
		this.group = group;
	}

	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.group;
	}
	
	
}
